package com.pethospital.dao;

import com.pethospital.entity.HealthRecord;
import com.pethospital.entity.PageResult;

import java.sql.Date;
import java.util.List;

/**
 * 健康记录数据访问接口
 * Health Record Data Access Object Interface
 * 
 * @author PetHospital System
 * @version 1.0
 */
public interface HealthRecordDao {
    
    /**
     * 根据记录ID查询健康记录
     * 
     * @param recordId 记录ID
     * @return HealthRecord 健康记录对象，如果不存在返回null
     */
    HealthRecord findById(Integer recordId);
    
    /**
     * 根据宠物ID查询健康记录列表
     * 
     * @param petId 宠物ID
     * @return List<HealthRecord> 健康记录列表
     */
    List<HealthRecord> findByPetId(Integer petId);
    
    /**
     * 根据主人ID查询健康记录列表
     * 
     * @param ownerId 主人ID
     * @return List<HealthRecord> 健康记录列表
     */
    List<HealthRecord> findByOwnerId(Integer ownerId);
    
    /**
     * 添加健康记录
     * 
     * @param healthRecord 健康记录对象
     * @return int 影响的行数
     */
    int insert(HealthRecord healthRecord);
    
    /**
     * 更新健康记录信息
     * 
     * @param healthRecord 健康记录对象
     * @return int 影响的行数
     */
    int update(HealthRecord healthRecord);
    
    /**
     * 删除健康记录
     * 
     * @param recordId 记录ID
     * @return int 影响的行数
     */
    int delete(Integer recordId);
    
    /**
     * 批量删除健康记录
     * 
     * @param recordIds 记录ID数组
     * @return int 影响的行数
     */
    int batchDelete(Integer[] recordIds);
    
    /**
     * 查询所有健康记录
     * 
     * @return List<HealthRecord> 健康记录列表
     */
    List<HealthRecord> findAll();
    
    /**
     * 分页查询健康记录
     * 
     * @param currentPage 当前页码
     * @param pageSize 每页大小
     * @return PageResult<HealthRecord> 分页结果
     */
    PageResult<HealthRecord> findByPage(int currentPage, int pageSize);
    
    /**
     * 根据宠物ID分页查询健康记录
     * 
     * @param petId 宠物ID
     * @param currentPage 当前页码
     * @param pageSize 每页大小
     * @return PageResult<HealthRecord> 分页结果
     */
    PageResult<HealthRecord> findByPetIdAndPage(Integer petId, int currentPage, int pageSize);
    
    /**
     * 根据主人ID分页查询健康记录
     * 
     * @param ownerId 主人ID
     * @param currentPage 当前页码
     * @param pageSize 每页大小
     * @return PageResult<HealthRecord> 分页结果
     */
    PageResult<HealthRecord> findByOwnerIdAndPage(Integer ownerId, int currentPage, int pageSize);
    
    /**
     * 根据条件分页查询健康记录
     * 
     * @param petName 宠物姓名（模糊查询）
     * @param diagnosis 诊断结果（模糊查询）
     * @param doctorName 医生姓名
     * @param visitDateStart 就诊开始日期
     * @param visitDateEnd 就诊结束日期
     * @param ownerId 主人ID（可选，为null时查询所有）
     * @param currentPage 当前页码
     * @param pageSize 每页大小
     * @return PageResult<HealthRecord> 分页结果
     */
    PageResult<HealthRecord> findByCondition(String petName, String diagnosis, String doctorName,
                                           Date visitDateStart, Date visitDateEnd, Integer ownerId,
                                           int currentPage, int pageSize);
    
    /**
     * 统计健康记录总数
     * 
     * @return long 健康记录总数
     */
    long countAll();
    
    /**
     * 根据宠物ID统计健康记录数量
     * 
     * @param petId 宠物ID
     * @return long 健康记录数量
     */
    long countByPetId(Integer petId);
    
    /**
     * 根据主人ID统计健康记录数量
     * 
     * @param ownerId 主人ID
     * @return long 健康记录数量
     */
    long countByOwnerId(Integer ownerId);
    
    /**
     * 根据医生统计记录数量
     * 
     * @param doctorName 医生姓名
     * @return long 记录数量
     */
    long countByDoctor(String doctorName);
    
    /**
     * 根据日期范围统计记录数量
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return long 记录数量
     */
    long countByDateRange(Date startDate, Date endDate);
    
    /**
     * 获取医生统计信息
     * 
     * @return List<Object[]> 统计结果，每个数组包含[医生姓名, 记录数量]
     */
    List<Object[]> getDoctorStatistics();
    
    /**
     * 获取月度统计信息
     * 
     * @param year 年份
     * @return List<Object[]> 统计结果，每个数组包含[月份, 记录数量]
     */
    List<Object[]> getMonthlyStatistics(int year);
    
    /**
     * 查询需要复诊的记录
     * 
     * @return List<HealthRecord> 需要复诊的记录列表
     */
    List<HealthRecord> findRecordsNeedingFollowUp();
    
    /**
     * 查询最近的健康记录
     * 
     * @param petId 宠物ID
     * @param limit 限制数量
     * @return List<HealthRecord> 最近的健康记录列表
     */
    List<HealthRecord> findRecentRecords(Integer petId, int limit);
    
    /**
     * 根据宠物ID获取最新的健康记录
     * 
     * @param petId 宠物ID
     * @return HealthRecord 最新的健康记录，如果不存在返回null
     */
    HealthRecord findLatestByPetId(Integer petId);
    
    /**
     * 查询今日新增的健康记录
     * 
     * @return List<HealthRecord> 今日新增的健康记录列表
     */
    List<HealthRecord> findTodayRecords();
    
    /**
     * 根据费用范围查询记录
     * 
     * @param minCost 最小费用
     * @param maxCost 最大费用
     * @return List<HealthRecord> 健康记录列表
     */
    List<HealthRecord> findByCostRange(Double minCost, Double maxCost);
}
